package co.edu.udea.iw.prestamos.ws;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import co.edu.udea.iw.prestamos.bl.DispositivoBL;
import co.edu.udea.iw.prestamos.modelo.dto.Dispositivo;
import co.edu.udea.iw.prestamos.util.seguridad.Autorizacion;

@Path("dispositivos")
@Component
@Transactional
public class DispositivoResource {
	
	@Autowired
	private DispositivoBL dispositivoBL;
	
	@Autowired
	private Autorizacion autorizacion;
	
	@GET
	@Produces({MediaType.APPLICATION_JSON})
	public Object obtenerDispositivos(@HeaderParam("user")  String username, 
							          @HeaderParam("role")  String rol,
							          @HeaderParam("token") String token){
		
		Set<String> roles = new HashSet<String>() {{ add(Autorizacion.ROLE_ADMIN); add(Autorizacion.ROLE_INVESTIGADOR); }};
		if( autorizacion.isNotAuthorized(roles, username, rol) )
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		return dispositivoBL.obtenerDispositivosDisponibles();
	}
	
	@GET
	@Produces({MediaType.APPLICATION_JSON})
	@Path("nodisponibles")
	public Object obtenerNoDisponibles(@HeaderParam("user")  String username, 
							           @HeaderParam("role")  String rol,
							           @HeaderParam("token") String token){
		
		Set<String> roles = new HashSet<String>() {{ add(Autorizacion.ROLE_ADMIN); }};
		if( autorizacion.isNotAuthorized(roles, username, rol) )
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		return dispositivoBL.obtenerDispositivosNoDisponibles();
	}
	
	@GET
	@Produces({MediaType.APPLICATION_JSON})
	@Path("fecha/{fecha}")
	public Object obtenerDispositivos(@PathParam("fecha")   String fecha,
									  @HeaderParam("user")  String username, 
									  @HeaderParam("role")  String rol,
									  @HeaderParam("token") String token){
		
		Set<String> roles = new HashSet<String>() {{ add(Autorizacion.ROLE_ADMIN); add(Autorizacion.ROLE_INVESTIGADOR); }};
		if( autorizacion.isNotAuthorized(roles, username, rol) )
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		return dispositivoBL.obtenerDisponiblesFecha(fecha);
	}
	
	@GET
	@Path("{id}")
	@Produces(MediaType.APPLICATION_JSON)
	public Object obtenerDispositivo(@PathParam("id") int id,
								     @HeaderParam("user")  String username, 
									 @HeaderParam("role")  String rol,
									 @HeaderParam("token") String token){
		
		Set<String> roles = new HashSet<String>() {{ add(Autorizacion.ROLE_ADMIN); add(Autorizacion.ROLE_INVESTIGADOR); }};
		if( autorizacion.isNotAuthorized(roles, username, rol) )
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		return dispositivoBL.obtenerDispositivo(id);
	}
	
	@PUT
	@Path("{id}/darbaja/{disponibildad}")
	public Object darBaja(@PathParam("id")      int id,
						  @PathParam("estado")  boolean disponibildad,
						  @HeaderParam("user")  String username, 
					      @HeaderParam("role")  String rol,
						  @HeaderParam("token") String token){
		
		Set<String> roles = new HashSet<String>() {{ add(Autorizacion.ROLE_ADMIN); }};
		if( autorizacion.isNotAuthorized(roles, username, rol) )
			throw new WebApplicationException(Response.Status.FORBIDDEN);
		
		return dispositivoBL.cambiarDisponibilidad(id, disponibildad);
	}
	
	@POST
	@Produces(MediaType.APPLICATION_JSON)
	public Object registrarDispositivo(Dispositivo dispositivo,
										  @HeaderParam("user")  String username, 
									      @HeaderParam("role")  String rol,
										  @HeaderParam("token") String token){
		
		return dispositivoBL.registrarDispositivo(dispositivo);
	}
	
	
}
